﻿using System;
using System.Threading;

namespace JinYuan.Helper
{
    /// <summary>
    /// 定时器重置时间间隔，定时器执行未超间隔则设置剩余时间后再次触发，超时则立即触发
    /// </summary>
    public class TimerReset : IDisposable
    {
        private Timer timer;
        private DateTime nextTime;

        /// <summary>
        /// 使用using语句，在定时器TimerCallback中使用
        /// using语句块内为时间到时的执行代码，dispose计算使用的时间，来重设下次触发时间
        /// </summary>
        /// <param name="tim">定时器</param>
        /// <param name="ep">时间间隔</param>
        public TimerReset(Timer tim, int ep)
        {
            timer = tim;
            nextTime = DateTime.Now.AddMilliseconds(ep);//设置下次执行时间
        }
        public void Dispose()
        {
            //执行完后,重新设置定时器下次执行时间.
            TimeSpan timeout = nextTime.Subtract(DateTime.Now);
            if (timeout < TimeSpan.Zero)
            {
                timeout = TimeSpan.Zero;
            }

            timer.Change(timeout, Timeout.InfiniteTimeSpan);
        }
    }
}
